package ligueBaseball;

import java.io.*;
import java.sql.Date;
import java.sql.Time;
import java.util.StringTokenizer;
import java.text.*;

/**
 * Interface du syst�me de gestion la bd de la ligue de Baseball
 *
 */
public class Ligue {

    private static GestionLigue gestionLigue;
    private static boolean lectureAuClavier;

    /**
     * Ouverture de la BD,
     * traitement des transactions et
     * fermeture de la BD.
     */
    public static void main(String argv[])
            throws Exception {
// validation du nombre de param�tres
        if (argv.length < 3) {
            System.out.println("Usage: java LigueBaseball <user> <password> <bd> [<fichier-transactions>]");
            System.out.println(Connexion.serveursSupportes());
            return;
        }

        try {
            // ouverture du fichier de transactions
            // s'il est sp�cifi� comme argument
            lectureAuClavier = true;
            InputStream sourceTransaction = System.in;
            if (argv.length > 3) {
                sourceTransaction = new FileInputStream(argv[3]);
                lectureAuClavier = false;
            }
            BufferedReader reader =
                    new BufferedReader(
                    new InputStreamReader(sourceTransaction));

            gestionLigue = new GestionLigue("postgres", argv[2], argv[0], argv[1]);
            traiterTransactions(reader);
        } catch (Exception e) {
            e.printStackTrace(System.out);
        } finally {
            gestionLigue.fermer();
        }
    }

    /**
     */
    static void traiterTransactions(BufferedReader reader)
            throws Exception {
        afficherAide();
        String transaction = lireTransaction(reader);
        while (!finTransaction(transaction)) {
            /* d�coupage de la transaction en mots*/
            StringTokenizer tokenizer = new StringTokenizer(transaction, " ");
            if (tokenizer.hasMoreTokens()) {
                executerTransaction(tokenizer);
            }
            transaction = lireTransaction(reader);
        }
    }

    /**
     * Lecture d'une transaction
     */
    static String lireTransaction(BufferedReader reader)
            throws IOException {
        System.out.print("> ");
        String transaction = reader.readLine();
        /* echo si lecture dans un fichier */
        if (!lectureAuClavier) {
            System.out.println(transaction);
        }
        return transaction;
    }

    /**
     * D�codage et traitement d'une transaction
     */
    static void executerTransaction(StringTokenizer tokenizer)
            throws Exception {
        try {
            String command = tokenizer.nextToken();

            if ("aide".startsWith(command)) {
                afficherAide();
            } else if ("creerEquipe".startsWith(command)) {
                gestionLigue.getGestionEquipe().creer(readString(tokenizer));
            } else if ("afficherEquipes".startsWith(command)) {
                gestionLigue.getGestionEquipe().afficher();
            } else if ("supprimerEquipe".startsWith(command)) {
                gestionLigue.getGestionEquipe().supprimerEquipe(readString(tokenizer));
            } else if ("creerJoueur".startsWith(command)) {
                String joueurnom = readString(tokenizer);
                String joueurprenom = readString(tokenizer);
                gestionLigue.getGestionJoueur().creerJoueur(joueurnom, joueurprenom);
                String equipenom = readString(tokenizer);
                if (equipenom != null) {
                    if (gestionLigue.getGestionEquipe().existe(equipenom)) {
                        int joueurId = gestionLigue.getJoueur().getJoueurId(joueurnom, joueurprenom);
                        int equipeId = gestionLigue.getEquipe().getEquipeId(equipenom);
                        gestionLigue.getGestionFaitPartie().creerFaitPartie(joueurId, equipeId, readInt(tokenizer), readString(tokenizer));
                    }
                }
            } else if ("afficherJoueursEquipe".startsWith(command)) {
                gestionLigue.getGestionInterrogation().afficherJoueursEquipe(readString(tokenizer));
            } else if ("supprimerJoueur".startsWith(command)) {
                gestionLigue.getGestionJoueur().supprimerJoueur(readString(tokenizer),
                        readString(tokenizer));
            } else if ("creerMatch".startsWith(command)) {
                gestionLigue.getGestionMatch().creerMatch(
                        readString(tokenizer),
                        readString(tokenizer),
                        readString(tokenizer),
                        readString(tokenizer));
            } else if ("creerArbitre".startsWith(command)) {
                gestionLigue.getGestionArbitre().creerArbitre(readString(tokenizer),
                        readString(tokenizer));
            } else if ("afficherArbitres".startsWith(command)) {
                gestionLigue.getGestionArbitre().afficherArbitres();
            } else if ("arbitrerMatch".startsWith(command)) {
                gestionLigue.getGestionArbitrer().arbitrerMatch(readString(tokenizer),
                        readString(tokenizer),
                        readString(tokenizer),
                        readString(tokenizer),
                        readString(tokenizer),
                        readString(tokenizer));
            } else if ("entrerResultatMatch".startsWith(command)) {
                gestionLigue.getGestionMatch().entrerResultatMatch(
                        readString(tokenizer),
                        readString(tokenizer),
                        readString(tokenizer),
                        readString(tokenizer),
                        readInt(tokenizer),
                        readInt(tokenizer));
            } else if ("afficherResultatsDate".startsWith(command)) {
                gestionLigue.getGestionMatch().afficherResultatsDate(readDate(tokenizer));
            } else if ("afficherResultats".startsWith(command)) {
                gestionLigue.getGestionMatch().afficherResultats(readString(tokenizer));
            } else if ("--".startsWith(command)) {
            } else {
                System.out.println(
                        "  Transactions non reconnue.  Essayer \"aide\"");
            }

        } catch (LigueException e) {
            System.out.println("** " + e.toString());
        }

    }

    /** Affiche le menu des transactions acceptees par le systeme */
    static void afficherAide() {
        System.out.println();
        System.out.println("*************************************************");
        System.out.println();
        System.out.println("creerEquipe <EquipeNom>");
        System.out.println("afficherEquipes");
        System.out.println("supprimerEquipe < EquipeNom >");
        System.out.println("creerJoueur <JoueurNom> <JoueurPrenom> [<EquipeNom> <Numero> [<DateDebut> ] ]");
        System.out.println("afficherJouersEquipe [<EquipeNom >]");
        System.out.println("supprimerJoueur <JoueurNom> <JoueurPrenom>");
        System.out.println("creerMatch  <MatchDate> <MatchHeure> <EquipeNomLocal> <EquipeNomVisiteur>");
        System.out.println("creerArbitre <ArbitreNom> <ArbitrePrenom>");
        System.out.println("afficherArbitres");
        System.out.println("arbitrerMatch <MatchDate> <MatchHeure> <EquipeNomLocal> <EquipeNomVisiteur> <ArbitreNom> <ArbitrePrenom>");
        System.out.println("entrerResultatMatch <MatchDate> <MatchHeure> <EquipeNomLocal> <EquipeNomVisiteur> <PointsLocal> <PointsVisiteur>");
        System.out.println("afficherResultatsDate [<APartirDate>]");
        System.out.println("afficherResultats <EquipeNom>");
        System.out.println();
        System.out.println("*************************************************");

    }

    /**
     * V�rifie si la fin du traitement des transactions est
     * atteinte.
     */
    static boolean finTransaction(String transaction) {
        /* fin de fichier atteinte */
        if (transaction == null) {
            return true;
        }

        StringTokenizer tokenizer = new StringTokenizer(transaction, " ");

        /* ligne ne contenant que des espaces */
        if (!tokenizer.hasMoreTokens()) {
            return false;
        }

        /* commande "exit" */
        String commande = tokenizer.nextToken();
        if (commande.equals("exit")) {
            return true;
        } else {
            return false;
        }
    }

    /** lecture d'une cha�ne de caract�res de la transaction entr�e � l'�cran */
    static String readString(StringTokenizer tokenizer)
            throws LigueException {
        if (tokenizer.hasMoreElements()) {
            return tokenizer.nextToken();
        }
        return null;
    }

    /**
     * lecture d'un int java de la transaction entr�e � l'�cran
     */
    static int readInt(StringTokenizer tokenizer)
            throws LigueException {
        if (tokenizer.hasMoreElements()) {
            String token = tokenizer.nextToken();
            try {
                return Integer.valueOf(token).intValue();
            } catch (NumberFormatException e) {
                throw new LigueException("Nombre attendu � la place de \"" +
                        token + "\"");
            }

        } else {
            throw new LigueException("autre param�tre attendu");
        }
    }

    /**
     * lecture d'un long java de la transaction entr�e � l'�cran
     */
    static long readLong(StringTokenizer tokenizer)
            throws LigueException {
        if (tokenizer.hasMoreElements()) {
            String token = tokenizer.nextToken();
            try {
                return Long.valueOf(token).longValue();
            } catch (NumberFormatException e) {
                throw new LigueException("Nombre attendu � la place de \"" +
                        token + "\"");
            }

        } else {
            throw new LigueException("autre param�tre attendu");
        }
    }

    /**
     * lecture d'une date en format YYYY-MM-DD
     */
    static Date readDate(StringTokenizer tokenizer)
            throws LigueException {
        if (tokenizer.hasMoreElements()) {
            String token = tokenizer.nextToken();
            try {
                Date date = new Date(FormatDate.convertirDate(token).getTime());
                return date;
            } catch (ParseException e) {
                throw new LigueException(
                        "Date en format YYYY-MM-DD attendue � la place  de \"" +
                        token + "\"");
            }
        }
        return null;
    }

    static Time readTime(StringTokenizer tokenizer)
            throws LigueException {
        if (tokenizer.hasMoreElements()) {
            String token = tokenizer.nextToken();
            try {
                Time time = new Time(FormatTime.convertirTime(token).getTime());
                return time;
            } catch (ParseException e) {
                throw new LigueException(
                        "Temps en format H:mm attendue a la place de \"" +
                        token + "\"");
            }

        } else {
            throw new LigueException("autre parametre attendu");
        }
    }
}

